package com.um2.mauction.session.impl;

import java.util.Iterator;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.um2.mauction.entity.Categorie;
import com.um2.mauction.entity.Produit;
import com.um2.mauction.session.remote.CategorieManagerRemote;

@Remote(CategorieManagerRemote.class)
@Stateless
public class CategorieManagerBean implements CategorieManagerRemote
{
	public static final String RemoteJNDIName = CategorieManagerBean.class
			.getSimpleName()
			+ "/remote";

	@PersistenceContext
	private EntityManager em;

	/**
	 * Retourne le nom de la categorie a partir de son identifiant
	 */
	public Categorie getCategorie(int idCategorie) 
	{
		Categorie cat = em.find(Categorie.class, idCategorie);
		return cat;
	}

	/**
	 * Ajoute une categorie
	 */
	public void addCategorie(String nomCategorie) 
	{
		em.persist(new Categorie(nomCategorie));
		// em.flush();
	}

	public int addCategorie(Categorie c) 
	{
		em.persist(c);
		return c.getIdCategorie();
	}

	/**
	 * Met a jour une categorie
	 */
	public void updateCategorie(int idCategorie, String nomCategorie) 
	{
		Categorie cat = em.find(Categorie.class, idCategorie);
		cat.setNomCategorie(nomCategorie);
	}

	/**
	 * Supprime une categorie
	 */
	public void deleteCategorie(int idCategorie) 
	{
		Categorie cat = em.find(Categorie.class, idCategorie);
		em.remove(cat);
	}

	/**
	 * Retourne la liste de toutes les categories
	 */
	@SuppressWarnings("unchecked")
	public List<Categorie> getAllCategories() 
	{
		Query query = em.createQuery("SELECT c " + "FROM Categorie c ");
		// Get categories
		List<Categorie> categories = query.getResultList();
		return categories;
	}

	/**
	 * Ajoute un produit existant a une categorie existante
	 * 
	 * @param idProduit
	 * @param idCategorie
	 */
	public void addProduitToCategorie(int idProduit, int idCategorie) 
	{
		Produit prod = em.find(Produit.class, idProduit);
		Categorie cat = em.find(Categorie.class, idCategorie);
		cat.assignProduit(prod);
	}

	@SuppressWarnings("unchecked")
	public Categorie getCategoryByName(String typeProduit) 
	{
		Query query = em
				.createQuery("SELECT c "
						+ "FROM Categorie c WHERE nomCategorie = '"
						+ typeProduit + "'");

		List<Categorie> cats = query.getResultList();

		Categorie c = null;
		for (Iterator<Categorie> iterator = cats.iterator(); iterator.hasNext();)
			c = iterator.next();
		return c;
	}

	public void mergeCategorie(Categorie c) 
	{
		em.merge(c);
	}
}